package com.waitingresult.thread;

import java.util.ArrayList;
import java.util.List;

/**
 * All right reserved,Designed By WangShuai
 *
 * @author : WangShuai
 * @version : V1.0
 * @ClassName : AbcDemo
 * @Description : 三个线程，当有一个线程 失败了， 其他两个线程也跟着立即停止 , 设计数据模型
 * @date : 2022/9/16 16:03
 */
public class AliQuickStartDemo {

    public static void main(String[] args) {
        //设计一个老大的子线程， 由这个子线程 去启动他下面的所有线程。  通过构造方法，让每一个子线程 得到老大的对象，并且执行完成之后 向老大进行返回数据结果，如果出错 怎么处理 没有出错 就不处理
        Boos boos = new Boos();
        Work t1 = new Work(boos, "T1", true, 2);
        Work t2 = new Work(boos, "T2", true, 5);
        Work t3 = new Work(boos, "T3", false, 1);
        boos.addTaskList(t1);
        boos.addTaskList(t2);
        boos.addTaskList(t3);
        boos.start();
    }
}
enum Result{
    NOTEND,SUCCESSEND,FINDEND;
}
class Boos extends Thread {
    private  List<Work> taskList = new ArrayList<>();
    public void addTaskList(Work work){
        taskList.add(work);
    }
    public void end(Work work){
        System.err.println("BOS_WORK_NAME" + work.getName());
        if(Result.FINDEND.equals(work.getResult())){
            System.err.println("存在错误");
            //System.exit(0);
            taskList.forEach( it -> {it.interrupt();});
        }
    }
    @Override
    public void run() {
        taskList.forEach(Thread::start);
    }

}
class Work extends Thread {
    private int m;
    private Boos boos;
    private Result result;
    private boolean flag;
    private int sleep;
    private String name;

    public Work (Boos boos,String name,boolean flag,int sleep){
        this.boos = boos;
        this.flag = flag;
        this.sleep = sleep;
        this.name = name;
    }

    public Result getResult() {
        return result;
    }

    @Override
    public void run() {
        System.err.println(name+"线程执行");
        try {
            Thread.sleep(sleep*1000);
            if(flag){
                result = Result.SUCCESSEND;
            }else{
                result = Result.FINDEND;
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        boos.end(this);
    }
}

